iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 3
3

經過上一篇努力一番建立好環境之後,接下終於要進入實作環節了OwO
如同學習程式語言的第一支程式是HelloWorld,LINE BOT的第一個練習就是鸚鵡式機器人
所謂鸚鵡式機器人就是 你說甚麼,它就說甚麼

主要會有幾個階段

  1. Coding
  2. 使用webhook建立連線
  3. 接收使用者訊息
  4. 回覆使用者訊息

事不宜遲就馬上開始吧

Coding

先到昨天建立的資料夾中開啟新檔案吧,用VScode開啟會更好喔!
名稱就叫main.py

先將模板放入main.py中

from flask import Flask, request, abort
from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import *


app = Flask(__name__)
# LINE BOT info
line_bot_api = LineBotApi('Channel Access token')
handler = WebhookHandler('Channel Secret')

@app.route("/callback", methods=['POST'])
def callback():
    signature = request.headers['X-Line-Signature']
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)
    print(body)
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)
    return 'OK'

# Message event
@handler.add(MessageEvent)
def handle_message(event):
    message_type = event.message.type
    user_id = event.source.user_id
    reply_token = event.reply_token
    message = event.message.text
    line_bot_api.reply_message(reply_token, TextSendMessage(text = message))

import os
if __name__ == "__main__":
    port = int(os.environ.get('PORT', 80))
    app.run(host='0.0.0.0', port=port)

第13行以及第14行中的 Channel Access token 以及 Channel Secret 改成上一篇提到要記的兩個值放入

模板解釋

  • Line 16~26
    指定在 /callback 通道上接收訊息,且方法是 POST
    而callback()是為了要檢查連線是否正常
    其中signature是LINE官方提供用來檢查該訊息是否透過LINE官方APP傳送
    body就是用戶傳送的訊息,並且是以JSON的格式傳送

  • Line 28~35
    這邊是用來接收訊息的地方
    特別注意到第35行的line_bot_api.reply_message()
    它是回傳訊息的方法,而我們設定回傳的型態是文字(text)

    而我們接收到的訊息會被放在event中,一樣會是JSON格式

    這邊特別注意這幾個內容

    • events.message.type
      這裡記錄訊息的型態
    • events.message.text
      如果是文字訊息(text)
      這裡會記錄傳送的文字
    • events.sourse.userId
      這裡記錄使用者的ID
  • Line 37~40
    這裡是指定我們的BOT執行的位置
    是在 0.0.0.0:80
    接上前面所說的,我們的BOT會接收訊息的位置也就是
    0.0.0.0:80/callback

Webhook

在實作之前,先帶大家看看webhook是什麼吧~
在前一篇提過的API,是我們主動要求訊息,再由對方的server回傳結果

考慮一個狀況
今天你是外送員要送餐,在送餐之前餐廳會先收到訂單
不過你要怎麼決定什麼時候去取餐呢?

  1. 一段時間就打一次電話到店家詢問餐點狀況
    不過這樣顯然效率過低
    而且如果說詢問頻率過高,可能會被投訴XD
  2. 讓店家完成後自己通知我們
    知道餐點狀況的只有店家自己
    如果他們完成後就能直接通知我們,那就會方便許多

Webhook就是這樣的道理
當LINE Platfrom接收到來自使用者的訊息後,透過API接口,webhook通道使得LINE Platform從被動方變成主動方,將訊息傳送到BOT Server

開始實作

實際上,這份code已經完成了鸚鵡的功能了,是在line 35的位置
那接下來我們就讓它動起來吧~

  1. 執行cmd,先開好兩個喔!
  2. 移動路徑到專案的資料夾中
  3. 在其中一個cmd執行以下指令
    ngrok.exe http 80
    
    如果你是使用WSL的話
    ./ngrok http 80
    
  4. 在另一個cmd執行以下指令
    python main.py 
    

到目前為止,你的畫面應該會是這個樣子

你會發現現在我們有一個在 0.0.0.0:80 上跑的python
還有一個會將訊息導向 localhost:80 上的webhook
我們現在只需要讓LINE 知道我們的webhook在哪裡就完成了!

前往 https://manager.line.biz/ 登入自己的LINE帳號,並進入自己的LINE BOT
點擊右上角的設定 > Messaging API

將Webhook網址改成剛剛ngrok上看到的網址加上/callback並儲存

這樣一來,我們的通道就建構成功啦!
先將我們的LINE BOT加入好友後來試試看功能吧!
LINE ID可以在剛剛的網頁上方找到

接下來就可以跟自己的BOT聊天啦~

到這邊,鸚鵡型機器人就完成了!
現在,你可把使用者傳送過來的訊息當作是輸入
handle message當成是main函數
line_bot_api.reply_message(reply_token, ...)當成是輸出
中間透過自訂的程式,可以再自己嘗試看看其他玩法喔!
像是只會說早安的機器人XD

當作程式的輸入輸出是很重要的概念
中間訊息究竟如何被傳送我們不明白
但是我們知道,只要透過這種方式一定能將訊息傳送到,這就是API帶來的效果

後記

一開始有在想直接給模板是不是好的
不過好像也想不到其他做法,就如同一開始學C++

#include<iostream>
using namespace std;
int main(){

    return 0;
}

把這個當成必須存在的模板,之後再慢慢了解體會它的涵義

希望大家也可以嘗試自己實做看看
光是看文章而沒有動手去做是很可惜的
(難道你們都沒有創造新東西會有的那種快感嗎QQ
加油,之後很多實作內容都是以這個為基礎,只要熟悉這裡後面就會輕鬆很多
大概就是做資料處理跟Python語法問題了XDD


上一篇
Day02 環境建構
下一篇
Day04 部署到Heroku
系列文
LINE BOT 新手村30日攻略30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
jo890117
iT邦新手 5 級 ‧ 2022-03-15 15:41:21

你好,我造著複製程式碼下載pip3 install line-bot-sdk flask
但會找不到linebot
File ".\main.py", line 2, in
from linebot import (
ModuleNotFoundError: No module named 'linebot'
可以請問該怎麼解決嗎

Koios iT邦新手 4 級 ‧ 2022-06-15 17:00:46 檢舉

可能會是因為當初沒有裝好 line-bot-sdk
如果有當時 pip install 的訊息也許比較好確認
不過也許可以嘗試看看把 pip3 改成 pip

我要留言

立即登入留言